import pymysql
from flask import Flask, render_template, redirect, url_for
from sqlalchemy.orm import sessionmaker

from 个人简历.models.models import User, engine

# 2. 用flask创建应用对象
app = Flask(__name__, static_folder='static', static_url_path='/static')


# 3. 用应用对象.route("/profile.html")对函数进行装饰，这个函数中写业务逻辑
@app.route("/index")
@app.route("/")
def index():
    return "这是我第一个Flask网页..."


@app.route("/profile")
def profile():
    return "这是个人中心页面"


@app.route("/profile2")
def profile2():
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile3/10086")
@app.route("/profile3/10010")
def profile3():
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile4/<user_id>")
def profile4(user_id):
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile5/<user_id>/<user_name>")
def profile5(user_id, user_name):
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile6/<user_id>/<user_name>")
def profile6(**kwargs):
    print(kwargs)
    # kwargs[""]
    # kwargs.get("user_id")
    print(kwargs.get("user_id"))

    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile7/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile7(user_id):  # 如果想要调用profile7成功，那么只有user_id这个位置的值是纯数字的时候才可以调用
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将内容当作字符串返回
    return content


@app.route("/profile8/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile8(user_id):  # 如果想要调用profile8成功，那么只有user_id这个位置的值是纯数字的时候才可以调用
    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将显示用户名字的位置替换为账号
    content = content.replace("xxxxx", str(user_id))

    # 将内容当作字符串返回
    return content


@app.route("/profile9/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile9(user_id):
    # 如果一个函数它是一个普通的功能函数，它一般包括两个功能：
    # 1. 业务方面的数据处理（对变量user_id的使用，例如查询数据库等）
    # 2. 模版的替换（对应profile.html的获取以及字符串的替换）

    # 1. 打开profile.html
    with open("templates/profile.html") as f:
        # 2. 读取其内容
        content = f.read()

    # 将显示用户名字的位置替换为账号
    content = content.replace("xxxxx", str(user_id))

    # 将内容当作字符串返回
    return content


@app.route("/profile10/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile10(user_id):
    # 使用模版（jinjia2模版引擎），可以对html的数据处理进行了封装
    return render_template("profile.html", user_name="张国强",
                           user_head_png="6062.png")  # 注意：他们默认到templates文件夹中找 profile.html


@app.route("/profile11/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile11(user_id):
    # 1. 业务处理  # 例如user_id=6062
    # 1. 查询数据库
    # 1.1 创建Connection连接
    conn = pymysql.connect(host='172.16.100.10', port=3306, database='flask_1', user='root', password='Tcdn@2007.',
                           charset='utf8')
    # 1.2 获得Cursor对象
    cs1 = conn.cursor()
    # 1.3 构造参数列表
    params = [user_id]
    # 1.4 执行select语句，并返回受影响的行数：查询所有数据
    cs1.execute('select * from user where user_id=%s', params)
    # 1.5 获取查询的结果
    result = cs1.fetchone()
    # result = cs1.fetchall()
    print(result)
    # 1.6 关闭Cursor对象
    cs1.close()
    # 1.7 闭Connection对象
    conn.close()

    # 2. 模版替换
    # return render_template("profile.html", user_name="张国强",
    return render_template("profile.html", user_name=result[2],
                           user_head_png=result[3], short_desc=result[4])  # 注意：他们默认到templates文件夹中找 profile.html


@app.route("/profile12/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile12(user_id):
    # 1. 业务处理
    # DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话，返回的是一个类
    # session = DBSession()  # 生产链接数据库的实例
    session = sessionmaker(bind=engine)()  # 以上合并为一条
    user_ret = session.query(User).filter(User.user_id == user_id).one()
    print(user_ret)

    session.close()

    # 2. 模版替换
    # return render_template("profile.html", user_name="张国强", user_head_img="6062.png")
    return render_template("profile.html", user_name=user_ret.user_name, head_img=user_ret.head_img,
                           short_description=user_ret.short_description)
    # return render_template("profile.html", user_name="张国强", return render_template("profile.html",
    # user_name=result[2], user_head_png = result[3], short_desc = result[4])  # 注意：他们默认到templates文件夹中找 profile.html


@app.route("/profile13/<int:user_id>")  # int:不是说user_id变量名是int类型，而是过滤器。
def profile13(user_id):
    # 1. 业务处理
    # DBSession = sessionmaker(bind=engine)  # 创建与数据库的会话，返回的是一个类
    # session = DBSession()  # 生产链接数据库的实例
    session = sessionmaker(bind=engine)()  # 以上合并为一条
    user_ret = session.query(User).filter(User.user_id == user_id).one()
    print(user_ret)

    session.close()

    # 2. 模版替换
    # return render_template("profile.html", user_name="张国强", user_head_img="6062.png")

    # return render_template("profile.html", user_name=user_ret.user_name, head_img=user_ret.head_img,
    # short_description = user_ret.short_description)

    return render_template("profile2.html", user=user_ret)
    # return render_template("profile.html", user_name="张国强", return render_template("profile.html",
    # user_name=result[2], user_head_png = result[3], short_desc = result[4])  # 注意：他们默认到templates文件夹中找 profile.html


@app.route("/login")
def login():
    # login 表示登录的意思，它的主要作用：判断用户名以及密码或者还有验证码是否成立，如果成立则告知浏览器用户登录成功，且让浏览器自动跳转到主页
    # return redirect("www.baidu.com")
    # return redirect("/index")  # http://127.0.0.1:5000/index
    # return redirect("/profile13/6062")
    return redirect(url_for("profile13", user_id="6062"))  # http://127.0.0.1:5000/profile13/6062


@app.route("/demo_status")
def demo_status():
    # return '状态码'
    return '状态码', 520


# 4. 应用程序.run()
# app.run(debug=True, port=5000, host="0.0.0.0")  # 开启调试模式，意味着，如果有代码改动，flask会自动重启服务器
app.run(debug=True)  # 开启调试模式，意味着，如果有代码改动，flask会自动重启服务器

# 查看当前Flask的所有url以及函数对应的关系（这其实就是路由）
# print(app.url_map)
# Map([<Rule '/accset/<filename>' (HEAD, OPTIONS, GET) -> accset>,
#  <Rule '/' (HEAD, OPTIONS, GET) -> index>,
#  <Rule '/profile' (HEAD, OPTIONS, GET) -> profile>,8/
#  <Rule '/profile2' (HEAD, OPTIONS, GET) -> profile2>])
